from django.db import models
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
from django.core.validators import RegexValidator

class ScheduledTask(models.Model):
    """定时任务模型"""
    
    # 任务名称
    name = models.CharField(
        _('任务名称'),
        max_length=100,
        help_text=_('请输入任务名称，用于标识不同的定时任务')
    )
    
    # 任务描述
    description = models.TextField(
        _('任务描述'),
        blank=True,
        null=True,
        help_text=_('请输入任务的详细描述')
    )
    
    # 定时规则 (cron表达式)
    cron_expression = models.CharField(
        _('定时规则'),
        max_length=100,
        help_text=_('请输入cron表达式，例如：0 * * * * 表示每小时执行一次'),
        validators=[
            RegexValidator(
                regex=r'^\s*((\*\s*/\s*\d+)|\d+|\*)\s+((\*\s*/\s*\d+)|\d+|\*)\s+((\*\s*/\s*\d+)|\d+|\*)\s+((\*\s*/\s*\d+)|\d+|\*)\s+((\*\s*/\s*\d+)|\d+|\*)\s*$',
                message=_('请输入有效的cron表达式')
            )
        ]
    )
    
    # 任务状态
    is_active = models.BooleanField(
        _('是否激活'),
        default=True,
        help_text=_('设置为关闭则不会执行定时任务')
    )
    
    # 创建信息
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='created_scheduled_tasks',
        verbose_name=_('创建者')
    )
    
    created_at = models.DateTimeField(
        _('创建时间'),
        auto_now_add=True
    )
    
    # 更新信息
    updated_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='updated_scheduled_tasks',
        verbose_name=_('更新者')
    )
    
    updated_at = models.DateTimeField(
        _('更新时间'),
        auto_now=True
    )
    
    # 最后执行信息
    last_executed_at = models.DateTimeField(
        _('最后执行时间'),
        null=True,
        blank=True,
        help_text=_('记录任务最后一次执行的时间')
    )
    
    last_execution_status = models.BooleanField(
        _('最后执行状态'),
        null=True,
        blank=True,
        help_text=_('记录任务最后一次执行是否成功')
    )
    
    last_execution_log = models.TextField(
        _('最后执行日志'),
        blank=True,
        null=True,
        help_text=_('记录任务最后一次执行的详细日志')
    )
    
    # Celery任务ID
    celery_task_id = models.CharField(
        _('Celery任务ID'),
        max_length=255,
        blank=True,
        null=True,
        help_text=_('记录Celery执行此任务的任务ID')
    )
    
    class Meta:
        verbose_name = _('定时任务')
        verbose_name_plural = _('定时任务')
        ordering = ['-created_at']
        unique_together = ['name', 'created_by']
    
    def __str__(self):
        return f'{self.name} ({"激活" if self.is_active else "禁用"})'

class TaskExecutionLog(models.Model):
    """任务执行日志模型"""
    
    task = models.ForeignKey(
        ScheduledTask,
        on_delete=models.CASCADE,
        related_name='execution_logs',
        verbose_name=_('任务'),
        null=True,
        blank=True
    )
    
    start_time = models.DateTimeField(
        _('开始时间'),
        auto_now_add=True
    )
    
    end_time = models.DateTimeField(
        _('结束时间'),
        null=True,
        blank=True
    )
    
    is_success = models.BooleanField(
        _('执行成功'),
        default=False
    )
    
    log_content = models.TextField(
        _('日志内容'),
        blank=True,
        null=True,
        help_text=_('记录任务执行的详细信息')
    )
    
    error_message = models.TextField(
        _('错误信息'),
        blank=True,
        null=True,
        help_text=_('如果执行失败，记录错误信息')
    )
    
    # 统计信息
    total_processed = models.IntegerField(
        _('处理总数'),
        default=0,
        help_text=_('本次执行处理的项目总数')
    )
    
    success_count = models.IntegerField(
        _('成功数量'),
        default=0,
        help_text=_('本次执行成功的项目数量')
    )
    
    failure_count = models.IntegerField(
        _('失败数量'),
        default=0,
        help_text=_('本次执行失败的项目数量')
    )
    
    # Celery任务ID
    celery_task_id = models.CharField(
        _('Celery任务ID'),
        max_length=255,
        blank=True,
        null=True,
        help_text=_('记录Celery执行此任务的任务ID')
    )
    
    class Meta:
        verbose_name = _('任务执行日志')
        verbose_name_plural = _('任务执行日志')
        ordering = ['-start_time']
    
    def __str__(self):
        status = '成功' if self.is_success else '失败'
        return f'{self.task.name} - {self.start_time.strftime("%Y-%m-%d %H:%M:%S")} ({status})'
